package com.Camellia.zy_video.controller;

import cn.hutool.core.util.RandomUtil;
import cn.hutool.crypto.SecureUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.Camellia.zy_video.entity.Admin;
import com.Camellia.zy_video.service.AdminService;
import com.Camellia.zy_video.vo.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;



@RestController
@RequestMapping("/admin")
public class AdminController {

    @Autowired
    private AdminService adminService;

    @PostMapping("/add")
    public R add(@RequestBody Admin admin) {
        // ...（方法内容）
        //根据名称查询管理员
        boolean b = adminService.exists(Wrappers.query(Admin.class).eq("username", admin.getUsername()));
        if (b) {
            //用户已存在
            return R.fail("用户已存在");
        }
        //实现对密码的加密
        //生成随机盐（token）
        String salt = RandomUtil.randomString(16);
        //将输入密码和盐组合
        String pwd = admin.getPassword() + salt;
        //使用md5算法对组合后的密码加密
        pwd = SecureUtil.md5(pwd);
        //将加密后的密码和随机盐设置到对象中
        admin.setPassword(pwd);
        admin.setSalt(salt);
        //将数据持久化到数据库
        return adminService.save(admin) ? R.ok("添加成功").setData(admin) : R.fail("添加失败");
    }


    @GetMapping("/login")
    public R login(String username, String password) {
        //TODO 尝试自行实现管理员登录功能，要求包含常规的业务功能：

        // 1. 根据用户名查询用户信息，包含随机盐
        Admin admin = adminService.getOne(Wrappers.query(Admin.class).eq("username", username));
        if (admin == null) {
            //用户不存在
            System.out.println("用户不存在");
            //return Result.build(null, ADMIN_ACCOUNT_NOT_EXIST_ERROR);
            return R.fail("用户不存在").setCode(-1);
        }
        // 2. 将输入的密码和盐组合进行md5加密
        password = SecureUtil.md5(password + admin.getSalt());
        // 3. 将加密后的密码与数据表中的密码比对
        if (password.equals(admin.getPassword())) {
            //密码正确
            //return Result.build(true, SUCCESS);
            return R.ok("登录成功").setData(admin);
        }
        // 5. 根据比对结果返回true或false
        //return Result.build(false, ADMIN_ACCOUNT_ERROR);
        return R.fail("密码错误").setCode(1);
    }

    /**
     * 管理员列表查询，含分页
     */
    @GetMapping("/list")
    public R list(@RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "5") Integer limit) {
        // 分页查询所有管理员 select * from admin limit ?,?
        List<Admin> list = adminService.list(new Page<Admin>(page, limit));
        // 查询总记录数
        Long count = adminService.count();
        return R.ok("查询成功").setData(list).setCount(count);
    }

    /**
     * 管理员密码修改
     */
    @GetMapping("/updatePwd")
    public R updatePwd(Admin admin){
        // 根据id查询管理员
        Admin a = adminService.getById(admin.getId());
        if (a == null){
            return R.fail("管理员不存在").setCode(-1);
        }

        //生成随机盐（token）
        String salt = RandomUtil.randomString(16);
        String pwd = SecureUtil.md5(admin.getPassword() + salt);
        admin.setSalt(salt);
        admin.setPassword(pwd);
        return adminService.updateById(admin) ? R.ok("修改成功") : R.fail("修改失败");
    }


    /*
           Vue+ElementUI
           React+Antd
           Layui+JQuery
           Bootstrap+JQuery
     */

}
